%include	'Macros.inc'
;
;	�������������� ������� ��
;	-------------------------
;
absolute	5ch			;��������� ���� ����� �����-�������� 5ch
Seg_glob	resw	1		;�����-������� ������� ���������� ����������
; ����������� ������� ������
	segment	data
;���������� ���������� (��������� ������ ���������)
Sector	times	256	db	0	;����� ��� ������� ������
Address	dw	0			;���. ����� ������� � ������� ������
Pf	db	0 			;������� �������������� = 1 - ���� �� �����, 0 - ��.
Lf	dw	0			;����� ��������� ����� � �������� �� 256 ����
Segin	dw	0			;����� ��� ����������� ������-�������� ������ ���������
B	db	0			;����� �������������� ����� � ���������� ���������� Sector
Nt	db	0			;����� (0 ��� 1) ������������� ������� � �����. 0 - ������� �������, 1 - �������
Lognum	dw	0			;���������� ����� �����
; ����������� ������� �����
	segment	stack
	times	64	db	0
; ����������� ������� ����
	segment	code
..start:
;"��������" ������������ �������� ������ � ��������. ������� ������
	mov	ax,data
	mov	es,ax
;����������� ���������� ���������� � ������� ������
	mov	cx,267			;CX <- ����� ���������� �������
	cld				;DF <- 0
	push	ds			;����������� �������� ����������� DS
	mov	ax,[Seg_glob]		;"��������" ���������� �������
	mov	ds,ax			; � �������� ������� ������
	xor	si,si			;SI <- 0
	xor	di,di			;DI <- 0
rep	movsb				;�������� �����������
;���������� �������� ������������� ��������� ���������
	mov	ax,code			;"��������" ������������ �������� ����
	mov	ds,ax                   ; � �������� ������� ������ 
        mov	[es:B],byte 0           ;����������� ���������
	mov	[es:Nt],byte 0		; �������
	call	Set_cursor		;������������� �������
.M1:	call	Read_byte          	;�������� ������� �������
	cmp	al,0h			;��� ����������� �������?
	jne	.M3		        ; ���
	cmp	ah,3Ch			;��� F2?
	jne	.M2			; ���
;	call	Write_sector            ;�������� Sector
	jmp	.Exit                   ;�����
.M2:	cmp	ah,3Eh			;��� F4?
	je	.Exit			; ��, ����� �����
	call	Edit_command		;���������� �������
	jmp	.M1			;��������� �������
.M3:	cmp	ax,011Bh		;ESC - �������?
	je	.Exit			; ��, ����� �����
	call	Test_digit_hex		;��� �����. �����
	jc	.M1            		; ���, ����� �������� ������� �������
	call	Write_digit_sector	;�����. ����� -> Sector
	jmp	.M1                     ;��������� �������
.Exit:	call	Set_cursor	        ;������������� �������
	pop	ds
;�������� ����������� ���������� ����������
	mov	cx,267			;CX <- ����� ���������� �������
	cld				;DF <- 0
	mov	bx,[Seg_glob]		;BX <- ����� ���������� ����������
	mov	ax,es			;"��������" � �������� ������� ������ 
	mov	ds,ax			; ������������ �������� ������
	mov	es,bx			;"��������" � ��������. ������� ������
	xor	si,si			;SI <- 0
	xor	di,di			;DI <-0
rep	movsb				;�������� �����������
;���������� ���������
	mov	ax,4c00h
	int	21h
;
;	�������� ����������������� �����
;	--------------------------------
; ����: AL - ASCII ���
; �����: DL - �����
;	 CF 1 - ���, 0 - ��
Test_digit_hex:    
	cmp	al,30h			;��� ������� ������ 30h
	jb	.M2			; ��, ��������� ��� ��� �� ����� � �������
	cmp	al,39h			;��� ������� ������ 39h
	ja	.M1			; ��, ��������� ������
	mov	dl,al		        ;����������� ���� ������� � ������� DL
	sub	dl,30h			;�������� �� ���� 30h
	clc				;CF <- 0
	jmp	.Exit			;�������
.M1:	cmp	al,41h			;��� ������� ������ 41h
	jb	.M2			; ��, ��������� ��� ��� �� ����� � ������� 
	cmp	al,46h			;��� ������� ������ 46h
	ja	.M2			; ��, ��������� ��� ��� �� ����� � ������� 
	mov	dl,al			;����������� ���� ������� � ������� DL
	sub	dl,37h                  ;�������� �� ���� 37h
	clc                             ;CF <- 0
	jmp	.Exit                   ;�������
.M2:	stc                             ;CF <- 1
.Exit:	ret                             ;�����

Write_digit_sector:
	push	ax
	push	bx
	xor	ax,ax
	xor	bx,bx
	mov	bl,[es:B]
	mov	al,[es:Sector+bx]
        cmp	[es:Nt],byte 0		;Nt = 0
	je	.M			; ��
	and	al,0f0h
	or	al,dl
	jmp	.Exit
.M:	and	al,0fh
	shl	dl,4
	or	al,dl
.Exit:	mov	[es:Sector+bx],al
	call	Set_cursor		;������������� �������
	call	Disp_sector	        ;����� Sector �� �����
	call	Cur_right 
	pop bx
	pop ax
	ret

Edit_command:
	push	bx
	pushf
	mov	bx,.Edit_Table		;BX <- adres tablici
.M1:	cmp	byte[bx],0ffh		;Konec tablici?
	je	.Exit			;Da, koda net v tablice
	cmp	ah,[bx]			;Eto vhod v tablicu?
	je	.Dispatch		;Da, vipolnit komandu
	add	bx,3			;Net, perehod k
	clc				; sleduyschemu
	jmp	.M2			; elementu tablici
.Dispatch:
 	inc	bx			;Adres proceduri
	call	[bx]			;Vizov proceduri
.Exit:	stc				; CF <- 1
.M2:	jnc	.M1			;Povtorenie dly novogo elementa tablici
	popf
	pop	bx
	ret
; Tablica soderjit skan-kodi upravlyuschih klavish i adresa
; procedur, vipolnyuschih sootvetstvuyuschie komandi
.Edit_Table	db	4dh		;<Right>
		dw	Cur_right
		db	4bh		;<Left>
		dw	Cur_left
		db	48h		;<Top>
		dw	Cur_top
		db	50h		;<Down>
		dw	Cur_down
		db	0ffh		;Konec tablici

%include	'Video_io.asm'		; -"-
%include	'Cursor.asm'		; -"-
%include	'Kbd_io.asm'		; -"-

		